/**
  ******************************************************************************
  * @file    spi_flash.h
  * @author  MCD Application Team
  * @version V1.0.0
  * @date    18-April-2011
  * @brief   This file contains all the functions prototypes for the spi_flash
  *          firmware driver.
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SPI_FLASH_H
#define __SPI_FLASH_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stdint.h"
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/

/* M25P SPI Flash supported commands */
#define sFLASH_CMD_WRITE 0x02 /* Write to Memory instruction */
#define sFLASH_CMD_WRSR 0x01 /* Write Status Register instruction */
#define sFLASH_CMD_WREN 0x06 /* Write enable instruction */
#define sFLASH_CMD_READ 0x03 /* Read from Memory instruction */
#define sFLASH_CMD_RDSR 0x05 /* Read Status Register instruction  */
#define sFLASH_CMD_RDID 0x9F /* Read identification */
#define sFLASH_CMD_SE 0xD8 /* Sector Erase instruction */
#define sFLASH_CMD_BE 0xC7 /* Bulk Erase instruction */

#define sFLASH_WIP_FLAG 0x01 /* Write In Progress (WIP) flag */

#define sFLASH_DUMMY_BYTE 0xA5
#define sFLASH_SPI_PAGESIZE 0x100

#define sFLASH_M25P128_ID 0x202018
#define sFLASH_M25P64_ID 0x202017
#define sFLASH_W25Q80_ID 0xEF4014

/* M25P FLASH SPI Interface pins  */
#define sFLASH_SPI SPI2
#define sFLASH_SPI_CLK RCC_APB1Periph_SPI2
#define sFLASH_SPI_CLK_INIT RCC_APB1PeriphClockCmd

#define sFLASH_SPI_SCK_PIN GPIO_Pin_13
#define sFLASH_SPI_SCK_GPIO_PORT GPIOB
#define sFLASH_SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOB
#define sFLASH_SPI_SCK_SOURCE GPIO_PinSource13
#define sFLASH_SPI_SCK_AF GPIO_AF_SPI2

#define sFLASH_SPI_MISO_PIN GPIO_Pin_14
#define sFLASH_SPI_MISO_GPIO_PORT GPIOB
#define sFLASH_SPI_MISO_GPIO_CLK RCC_AHB1Periph_GPIOB
#define sFLASH_SPI_MISO_SOURCE GPIO_PinSource14
#define sFLASH_SPI_MISO_AF GPIO_AF_SPI2

#define sFLASH_SPI_MOSI_PIN GPIO_Pin_15
#define sFLASH_SPI_MOSI_GPIO_PORT GPIOB
#define sFLASH_SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOB
#define sFLASH_SPI_MOSI_SOURCE GPIO_PinSource15
#define sFLASH_SPI_MOSI_AF GPIO_AF_SPI2

// F4board=PG8
// F2board=PB9
#if defined(STM32F207xx)
#define sFLASH_CS_PIN GPIO_PIN_9
#define sFLASH_CS_GPIO_PORT GPIOB
#define sFLASH_CS_GPIO_CLK RCC_AHB1Periph_GPIOB
#elif defined (STM32F407xx)
#define sFLASH_CS_PIN GPIO_PIN_8
#define sFLASH_CS_GPIO_PORT GPIOG
#define sFLASH_CS_GPIO_CLK RCC_AHB1Periph_GPIOG
#endif
/* Exported macro ------------------------------------------------------------*/
/* Select sFLASH: Chip Select pin low */
#define sFLASH_CS_LOW() HAL_GPIO_WritePin(sFLASH_CS_GPIO_PORT, sFLASH_CS_PIN ,GPIO_PIN_RESET)
/* Deselect sFLASH: Chip Select pin high */
#define sFLASH_CS_HIGH() HAL_GPIO_WritePin(sFLASH_CS_GPIO_PORT, sFLASH_CS_PIN, GPIO_PIN_SET)

/* Exported functions ------------------------------------------------------- */

/* High layer functions  */
void sFLASH_DeInit(void);
void sFLASH_Init(void);
void sFLASH_EraseSector(uint32_t SectorAddr);
void sFLASH_EraseBulk(void);
void sFLASH_WritePage(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
void sFLASH_WriteBuffer(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
void sFLASH_ReadBuffer(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);
uint32_t sFLASH_ReadID(void);
void sFLASH_StartReadSequence(uint32_t ReadAddr);

/* Low layer functions */
uint8_t sFLASH_ReadByte(void);
uint8_t sFLASH_SendByte(uint8_t byte);
uint16_t sFLASH_SendHalfWord(uint16_t HalfWord);
void sFLASH_WriteEnable(void);
void sFLASH_WaitForWriteEnd(void);

#ifdef __cplusplus
}
#endif

#endif /* __SPI_FLASH_H */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
